from flask_shop import db
from werkzeug.security import generate_password_hash,check_password_hash
from datetime import datetime

class BaseModel(object):
    create_time = db.Column(db.DateTime, default=datetime.now)
    update_time=db.Column(db.DateTime,default=datetime.now,onupdate=datetime.now)

# $env:FLASK_APP="manager"
# flask db init 初始化数据库同步文件
# flask db migrate 生成数据库表文件
# flask db upgrade 同步数据库

class User(BaseModel,db.Model):
    #在此的代码会在对应的数据库中创建表
    __tablename__= 't_users'
    id=db.Column(db.Integer,primary_key=True,autoincrement=True)
    name = db.Column(db.String(32),nullable=False,unique=False)
    pwd = db.Column(db.String(1024))
    nick_name = db.Column(db.String(32))
    phone = db.Column(db.String(11))
    email = db.Column(db.String(32))
    # status=0 #在实际开发中 删除用户只是一个逻辑删除 会设置一个状态码 1表示可用 0反之

    

# @property是Python中的一个装饰器，用于将一个方法定义为属性的getter方法
    @property
    def password(self):
        return self.pwd
    # @password.setter装饰器用于将一个方法定义为属性的setter方法。
    @password.setter
    def password(self,pwd):
        self.pwd = generate_password_hash(pwd) #数据加密
# 检查方法 将传入的密码和数据库中加密的密码进行比较     
    def check_password(self,pwd):
        #检查密码
        return check_password_hash(self.pwd,pwd)
    
    def to_dict(self):
        return{
            'id':self.id,
            'name':self.name,
            'nick_name':self.nick_name,
            'phone':self.phone,
            'email':self.email
        }
    

class Menu(db.Model):
    __tablename__='t_menus'
    id=db.Column(db.Integer,primary_key=True,autoincrement=True)
    name=db.Column(db.String(32),unique=True,nullable=False)
    level=db.Column(db.Integer,default=1)
    path=db.Column(db.String(32))

    pid=db.Column(db.Integer,db.ForeignKey('t_menus.id'))
    children=db.relationship('Menu')

    def to_dict_tree(self):
        return {
            'id': self.id,
            'name': self.name,
            'level': self.level,
            'path': self.path,
            'pid': self.pid,
            'children': [child.to_dict_tree() for child in self.children]
        }
    
    def to_dict_list(self):
        return {
            'id': self.id,
            'name': self.name,
            'path': self.path,
            'level': self.level,
            'pid': self.pid,
     }